package cn.edu.wynu.apis.string;

import cn.edu.wynu.apis.common.CommonFunctions;

public class StringBuilderLearn {
    public static void main(String[] args) {
        CommonFunctions.timeCost("StringBuilder任务", StringBuilderLearn::stringBuilderTask);
        CommonFunctions.timeCost("String任务", StringBuilderLearn::stringTask);
        chainOperator();

        // StringBuffer 和 StringBuilder功能类似,调用方式基本一样,
        // 不同的是,StringBuffer 是线程安全的,而 StringBuilder 不是
        // 因此在单线程环境下,建议使用 StringBuilder,因为它的效率更高
    }
    private static void chainOperator() {
        StringBuilder builder = new StringBuilder();
        // 链式操作是指在一个对象上连续调用多个方法，每个方法返回的都是该对象本身
        builder.append("hello,")
                .append("world")
                .append("!")
                .append("123");
        System.out.println(builder);
    }

    private static void stringBuilderTask() {
        StringBuilder sb = new StringBuilder(1024);
        for (int i = 0; i < 100000; i++) {
            sb.append(',').append(i); // 这里连续调用两次append方法叫作链式操作
        } // 耗时24ms
        String s = sb.toString();
        System.out.println(s);
        // StringBuilder 在拼接字符串时，不需要频繁创建新的对象，因此效率较高
    }
    private static void stringTask() {
        String s = "";
        for (int i = 0; i < 100000; i++) {
            s += "," + i;
        } // 耗时4658ms
        System.out.println(s);
        // String 在拼接字符串时，每次拼接都会创建一个新的对象，因此效率较低
    }
}
